package com.xy.webadmin.app.config;

import com.xy.webadmin.app.constant.MqttConstants;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;

import java.time.Duration;

/**
 * MQTT缓存配置类
 * 
 * 该类负责配置MQTT模块专用的Redis缓存管理器，主要用于：
 * 1. 缓存设备状态信息(mqttDeviceStatus)，减少对MQTT Broker API的频繁调用
 * 2. 缓存按公司分组的设备状态汇总(mqttDeviceStatusByCompany)
 * 3. 通过缓存提高系统性能并减轻MQTT Broker的负担
 * 4. 与应用中其他模块的缓存隔离，便于管理
 *
 * 缓存会在指定时间后自动过期，也可通过MqttCacheRefreshSchedule定时任务主动刷新
 *
 * @author xiaoyue
 * @date 2025-07-01
 */
@Configuration
@EnableCaching  // 启用Spring的缓存注解功能，使@Cacheable、@CacheEvict等注解生效
public class MqttCacheConfig {

    /**
     * 创建MQTT模块专用的Redis缓存管理器
     * 
     * @param connectionFactory Redis连接工厂，由Spring自动注入
     * @return MQTT专用的缓存管理器实例
     */
    @Bean("mqttCacheManager")
    public RedisCacheManager mqttCacheManager(RedisConnectionFactory connectionFactory) {
        // 创建缓存配置
        RedisCacheConfiguration cacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
                // 设置缓存默认过期时间(5分钟)
                .entryTtl(Duration.ofSeconds(MqttConstants.Cache.DEFAULT_TTL))
                // 允许缓存null值，但我们确保方法永远不返回null
                // 为所有MQTT相关的缓存键添加前缀，便于在Redis中识别和管理
                .prefixCacheNameWith(MqttConstants.Cache.PREFIX);
        // 构建并返回缓存管理器
        return RedisCacheManager.builder(connectionFactory)
                .cacheDefaults(cacheConfiguration)
                .build();
    }
} 